<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>禁用交换(swapping) | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'setup-configuration-memory.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/setup-configuration-memory.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/setup-configuration-memory.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/setup-configuration-memory.html" rel="nofollow" target="_blank">../en/setup-configuration-memory.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="setup.html">安装和设置</a></span>
»
<span class="breadcrumb-link"><a href="system-config.html">重要的系统配置</a></span>
»
<span class="breadcrumb-node">禁用交换(swapping)</span>
</div>
<div class="navheader">
<span class="prev">
<a href="setting-system-settings.html">« 配置系统设置</a>
</span>
<span class="next">
<a href="file-descriptors.html">文件描述符 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="setup-configuration-memory"></a>禁用交换(swapping)
</h2>
</div></div></div>
<p>
大多数操作系统都试图将尽可能多的内存用于文件系统缓存，并急切地交换出未使用的应用程序内存。
这可能导致部分 JVM 堆甚至其可执行页面被换出到磁盘。
</p>
<p>
交换(swapping) 对性能和节点稳定性非常不利，应该不惜一切代价避免。
这可能导致垃圾回收持续几<span class="strong strong"><strong>分钟</strong></span>而不是几毫秒，并可能导致节点响应缓慢，甚至与集群断开连接。
在弹性分布式系统中，让操作系统杀死节点更有效。
</p>
<p>
有三种方法可以禁用交换。
首选的选项是完全禁用交换。  
如果这不是一个选项，那么是否更倾向于最小化交换性而不是内存锁定取决于你的环境。  
</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="disable-swap-files"></a>禁用所有交换文件
</h3>
</div></div></div>
<p>
通常 Elasticsearch 是唯一运行在机器上的服务，它的内存使用由 JVM 选项控制。
应该不需要启用交换。
</p>
<p>在Linux系统上，您可以通过运行以下命令来临时禁用交换：</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">sudo swapoff -a</pre>
</div>
<p>这不需要重启 Elasticsearch。</p>
<p>
要永久禁用它，需要编辑 <code class="literal">/etc/fstab</code> 文件并注释掉任何包含单词 <code class="literal">swap</code> 的行。
</p>
<p>
在 Windows 上，可以通过 <code class="literal">System Properties → Advanced → Performance → Advanced → Virtual memory</code> 完全禁用分页文件来实现相同的效果。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="swappiness"></a>配置 <code class="literal">交换性(swappiness)</code>
</h3>
</div></div></div>
<p>
Linux系统上的另一个选项是确保 sysctl 值 <code class="literal">vm.swappiness</code> 设置为 <code class="literal">1</code>。
这降低了内核交换的倾向，并且在正常情况下不会导致交换，同时仍然允许整个系统在紧急情况下进行交换。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="bootstrap-memory_lock"></a>启用 <code class="literal">bootstrap.memory_lock</code>
</h3>
</div></div></div>
<p>
另一种选择是在Linux/Unix系统上使用<a href="http://opengroup.org/onlinepubs/007908799/xsh/mlockall.html" class="ulink" target="_top">mlockall</a>，或者在 Windows 上使用 <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa366895%28v=vs.85%29.aspx" class="ulink" target="_top">VirtualLock</a>，尝试将进程地址空间锁定到 RAM 中，防止任何 Elasticsearch 内存被换出。
这可以通过将下面这一行添加到 <code class="literal">config/elasticsearch.yml</code> 文件中来实现：
</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">bootstrap.memory_lock: true</pre>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>如果试图分配比可用内存更多的内存，<code class="literal">mlockall</code> 可能会导致 JVM 或 shell 会话退出！</p>
</div>
</div>
<p>
启动 Elasticsearch 后，可以通过检查下面这个请求输出中的 <code class="literal">mlockall</code> 值来查看该设置是否成功应用：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET _nodes?filter_path=**.mlockall</pre>
</div>
<div class="console_widget" data-snippet="snippets/36.console"></div>
<p>
如果你看到<code class="literal">mlockall</code> 为 <code class="literal">false</code>，那么这意味着 <code class="literal">mlockall</code> 请求已经失败。
你还会在日志中看到一行包含更多信息的文字：<code class="literal">Unable to lock JVM Memory</code>。
</p>
<p>
在Linux/Unix系统上，最可能的原因是运行 Elasticsearch 的用户没有锁定内存的权限。
可以按以下方式授予权限：
</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
使用 <code class="literal">.zip</code> 和 <code class="literal">.tar.gz</code> 归档文件安装的：
</span>
</dt>
<dd>
在启动 Elasticsearch 前, 以 root 身份设置 <a class="xref" href="setting-system-settings.html#ulimit" title="ulimit"><code class="literal">ulimit -l unlimited</code></a>，或者在 <a class="xref" href="setting-system-settings.html#limits.conf" title="/etc/security/limits.conf"><code class="literal">/etc/security/limits.conf</code></a> 文件中设置 <code class="literal">memlock</code> 为 <code class="literal">unlimited</code>。
</dd>
<dt>
<span class="term">
使用 RPM 和 Debian 包安装的：
</span>
</dt>
<dd>
在 <a class="xref" href="setting-system-settings.html#sysconfig" title="Sysconfig file">系统配置文件</a> 中设置 <code class="literal">MAX_LOCKED_MEMORY</code> 为 <code class="literal">unlimited</code> (或者参见下面使用<code class="literal">systemd</code>的系统)。
</dd>
<dt>
<span class="term">
使用 <code class="literal">systemd</code> 的系统：
</span>
</dt>
<dd>
在 <a class="xref" href="setting-system-settings.html#systemd" title="Systemd configuration">systemd 配置</a> 中设置 <code class="literal">LimitMEMLOCK</code> 为 <code class="literal">infinity</code> 。
</dd>
</dl>
</div>
<p>
另一个可能导致 <code class="literal">mlockall</code> 失败的原因是 <a class="xref" href="executable-jna-tmpdir.html" title="JNA temporary directory not mounted with noexec">JNA临时目录(通常是<code class="literal">/tmp</code>的一个子目录) 是使用选项 <code class="literal">noexec</code> 挂载的</a>。
这可以通过使用 <code class="literal">ES_JAVA_OPTS</code>环境变量为 JNA 指定一个新的临时目录来解决:
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=&lt;path&gt;"
./bin/elasticsearch</pre>
</div>
<p>或者在 jvm.options 配置文件中设置这个 JVM 标志。</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="setting-system-settings.html">« 配置系统设置</a>
</span>
<span class="next">
<a href="file-descriptors.html">文件描述符 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>